package com.jzt.jk.open.api.manage.application.assembler;

import com.jzt.jk.open.api.manage.infrastructure.util.CgLibBeanMapper;
import com.jzt.jk.open.api.manage.infrastructure.util.cglib.TypeConverter;

import java.util.Collection;
import java.util.List;

/**
 * 作者：lizw <br/>
 * 创建时间：2021/01/21 16:48 <br/>
 */
public class CommonAssembler {
    /**
     * 不同类型的JavaBean对象转换<br/>
     *
     * @param source           数据源JavaBean
     * @param destinationClass 需要转换之后的JavaBean类型
     * @param <T>              需要转换之后的JavaBean类型
     * @return 转换之后的对象
     */
    public static <T> T toBo(Object source, Class<T> destinationClass) {
        return CgLibBeanMapper.mapper(source, destinationClass);
    }

    /**
     * 不同类型的JavaBean对象转换<br/>
     *
     * @param source           数据源JavaBean
     * @param destinationClass 需要转换之后的JavaBean类型
     * @param typeConverters   自定义转换函数
     * @param <T>              需要转换之后的JavaBean类型
     * @return 转换之后的对象
     */
    public static <T> T toBo(Object source, Class<T> destinationClass, TypeConverter... typeConverters) {
        return CgLibBeanMapper.mapper(source, destinationClass, typeConverters);
    }

    /**
     * 不同类型的JavaBean对象转换<br/>
     *
     * @param source           数据源JavaBean
     * @param destinationClass 需要转换之后的JavaBean类型
     * @param <T>              需要转换之后的JavaBean类型
     * @return 转换之后的对象
     */
    public static <T> T toDto(Object source, Class<T> destinationClass) {
        return CgLibBeanMapper.mapper(source, destinationClass);
    }

    /**
     * 不同类型的JavaBean对象转换<br/>
     *
     * @param source           数据源JavaBean
     * @param destinationClass 需要转换之后的JavaBean类型
     * @param typeConverters   自定义转换函数
     * @param <T>              需要转换之后的JavaBean类型
     * @return 转换之后的对象
     */
    public static <T> T toDto(Object source, Class<T> destinationClass, TypeConverter... typeConverters) {
        return CgLibBeanMapper.mapper(source, destinationClass, typeConverters);
    }

    /**
     * 不同类型的JavaBean对象转换，基于Collection(集合)的批量转换<br/>
     * 如：List&lt;ThisBean&gt; <---->  List&lt;OtherBean&gt;<br/>
     *
     * @param sourceList       数据源JavaBean集合
     * @param destinationClass 需要转换之后的JavaBean类型
     * @param <T>              需要转换之后的JavaBean类型
     * @return 转换之后的对象集合
     */
    public static <T> List<T> toDtoList(Collection<?> sourceList, Class<T> destinationClass) {
        return CgLibBeanMapper.mapperCollection(sourceList, destinationClass);
    }

    /**
     * 不同类型的JavaBean对象转换，基于Collection(集合)的批量转换<br/>
     * 如：List&lt;ThisBean&gt; <---->  List&lt;OtherBean&gt;<br/>
     *
     * @param sourceList       数据源JavaBean集合
     * @param destinationClass 需要转换之后的JavaBean类型
     * @param <T>              需要转换之后的JavaBean类型
     * @return 转换之后的对象集合
     */
    public static <T> List<T> toBoList(Collection<?> sourceList, Class<T> destinationClass) {
        return CgLibBeanMapper.mapperCollection(sourceList, destinationClass);
    }
}
